package com.example;

import com.baomidou.mybatisplus.generator.*;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.*;
import java.util.Objects;

import java.util.Objects;

public class MybatisPlusGeneratorAppApplication {

    /* mysql 连接 */
    private static final String ip          = "127.0.0.1";
    private static final String port        = "3306";
    private static final String database    = "db_storage";
    private static final String url         = String.format("jdbc:mysql://%s:%s/%s?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai", ip, port, database);
    private static final String driverName  = "com.mysql.cj.jdbc.Driver";
    private static final String username    = "root";
    private static final String password    = "123456";

    /* 各种、各级别包名 */
    private static final String moduleName      = "storage-service";  // 模块名。如果是不是 maven 多模块项目，这里写 null 。
    private static final String parentPackage   = "com.example.storage"; // 父包名。如果为空，将下面子包名必须写全部，否则就只需写子包名
    private static final String mapperIn        = "dao";
    private static final String entityIn        = "dao.po";
    private static final String xmlIn           = "dao.xml";
    private static final String serviceIn       = "service";

    /* 要操作的表名 */
    private static final String tableNames      = "storage"; // 多个表名用逗号隔开。不要有空格。

    public static void main(String[] args) {
        try {
            generator();
            System.out.println("mybatis 代码生成成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Mybatis一键生成entity,mapper,mapper.xml,service,serviceImpl,controller
     */
    public static void generator() {
        AutoGenerator mpg = new AutoGenerator();
        mpg.setGlobalConfig(globalConfig());// 全局配置
        mpg.setDataSource(dataSourceConfig());// 数据源配置
        mpg.setPackageInfo(packageConfig());// 包配置
        mpg.setStrategy(strategyConfig());// 策略配置
        mpg.setTemplate(templateConfig());// 模板配置
        mpg.execute();
    }

    /**
     * 全局配置
     *
     * @return GlobalConfig
     */
    private static GlobalConfig globalConfig() {
        String projectPath = System.getProperty("user.dir");
        GlobalConfig globalConfig = new GlobalConfig();
        // 文件输出目录
        if (Objects.equals(moduleName.trim(), ""))
            globalConfig.setOutputDir(projectPath + "/src/main/java");
        else
            globalConfig.setOutputDir(projectPath + "/" + moduleName + "/src/main/java");
        // 添加作者信息
        globalConfig.setAuthor(System.getProperty("user.name"));
        //设置时间类型为Date
        globalConfig.setDateType(DateType.TIME_PACK);
        // 生成文件后不默认打开
        globalConfig.setOpen(false);
        // 设置生成的各种“东西”的名字
        globalConfig.setEntityName("%s");
        globalConfig.setMapperName("%sMapper");
        // 自定义service生成的名字，用于删除自动生成的I前缀
        //globalConfig.setServiceName("%sService");
        return globalConfig;
    }

    /**
     * 数据源设置
     *
     * @return DataSourceConfig
     */
    private static DataSourceConfig dataSourceConfig() {
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl(url);
        dataSourceConfig.setDriverName(driverName);
        dataSourceConfig.setUsername(username);
        dataSourceConfig.setPassword(password);
        return dataSourceConfig;
    }

    /**
     * 包配置
     *
     * @return PackageConfig
     */
    private static PackageConfig packageConfig() {
        // 包配置
        PackageConfig packageConfig = new PackageConfig();
        // 包名
        packageConfig.setParent(parentPackage);
        // 各个包目录起名
        packageConfig.setEntity(entityIn);
        packageConfig.setMapper(mapperIn);
        packageConfig.setXml(xmlIn);
//        packageConfig.setService(serviceIn);
        return packageConfig;
    }

    /**
     * 策略配置
     *
     * @return StrategyConfig
     */
    private static StrategyConfig strategyConfig() {
        // 策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        // 表名自动下划线转驼峰
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        // 字段名自动下划线转驼峰命
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
        // 设置实体类的lombok(此处看个人使用，如果不使用lombok，那么在生成之后再去添加构造方法等等)
        strategyConfig.setEntityLombokModel(true);
        strategyConfig.setRestControllerStyle(true);
        // scanner("表名，多个英文逗号分割").split(",")
        strategyConfig.setInclude((tableNames).split(","));
        // 驼峰生成方法
        strategyConfig.setControllerMappingHyphenStyle(true);
        return strategyConfig;
    }

    /**
     * 模板配置项
     *
     * @return TemplateConfig
     */
    private static TemplateConfig templateConfig() {
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(ConstVal.TEMPLATE_XML);
        // 不生成 mapper.xml 文件
        templateConfig.setXml(ConstVal.TEMPLATE_XML);
        // 不生成 service
        templateConfig.setService(null);
        // 不生成 service 实现类
        templateConfig.setServiceImpl(null);
        // 不生成 controller 类
        templateConfig.setController(null);
        return templateConfig;
    }
}
